"""
状态栏组件，显示各种状态信息
"""
from PyQt5.QtWidgets import QGroupBox, QVBoxLayout, QHBoxLayout, QLabel, QFrame, QWidget
from PyQt5.QtCore import Qt, pyqtSignal
from app.utils.logger import Logger
from app.services.service_locator import ServiceLocator
from app.state.app_state_manager import AppStateManager
from app.state.state_types import StateType, StateValues
from app.models.status_monitor_model import StatusMonitorModel, StatusType
import logging

class StatusBar(QGroupBox):
    """
    状态栏组件，显示各种状态信息
    使用 AppStateManager 进行状态管理
    """
    
    def __init__(self, parent=None):
        """
        初始化状态栏
        """
        super().__init__("状态监控", parent)
        
        # 获取日志记录器
        self.logger = logging.getLogger(__name__)
        self.setMaximumHeight(45)  # 减小高度到45
        
        # 获取状态监控模型
        try:
            self.status_monitor = StatusMonitorModel.instance()
        except Exception as e:
            self.logger.error(f"获取状态监控模型失败: {str(e)}")
            self.status_monitor = None
        
        self._init_ui()
        
        # 注册状态变更监听器
        if self.status_monitor:
            self._register_status_listeners()
        else:
            self.logger.warning("状态监控模型不可用，将不会注册状态变更监听器")
        
        self.logger.debug("状态栏初始化完成")
    
    def _init_ui(self):
        """
        初始化UI
        """
        # 创建主布局
        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(10, 5, 10, 5)  # 设置外边距
        self.layout.setSpacing(0)  # 减小间距为0
        
        # 创建状态信息行
        self.status_info_layout = QHBoxLayout()
        self.status_info_layout.setSpacing(10)  # 设置状态项之间的间距
        self.status_info_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        self.status_info_layout.setAlignment(Qt.AlignCenter)  # 居中对齐所有状态项
        
        # 创建各个状态显示
        self._create_connection_status()
        self._add_separator()
        self._create_audio_service_status()
        self._add_separator()
        self._create_ai_service_status()
        self._add_separator()
        self._create_sync_status()
        self._add_separator()
        self._create_keyword_status()
        self._add_separator()
        self._create_user_join_status()
        self._add_separator()
        self._create_audio_output_status()
        
        # 添加状态信息行到主布局
        self.layout.addLayout(self.status_info_layout)
    
    def _register_status_listeners(self):
        """注册状态监听器"""
        # 连接状态
        self.status_monitor.add_listener(StatusType.CONNECTION, self.update_connection_status)
        
        # 音频服务状态
        self.status_monitor.add_listener(StatusType.AUDIO_SERVICE, self.update_audio_service_status)
        
        # AI服务状态
        self.status_monitor.add_listener(StatusType.AI_SERVICE, self.update_ai_service_status)
        
        # 音画同步状态
        self.status_monitor.add_listener(StatusType.SYNC, self.update_sync_status)
        
        # 关键词状态
        self.status_monitor.add_listener(StatusType.KEYWORD, self.update_keyword_status)
        
        # 用户加入状态
        self.status_monitor.add_listener(StatusType.USER_JOIN, self.update_user_join_status)
        
        # 音频输出状态
        self.status_monitor.add_listener(StatusType.AUDIO_OUTPUT, self.update_audio_output_status)
    
    def _create_connection_status(self):
        """创建直播间状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        connection_layout = QHBoxLayout(status_widget)
        connection_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        connection_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        connection_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        connection_label = QLabel("直播间:")
        connection_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        connection_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.connection_status = QLabel("未连接")
        self.connection_status.setStyleSheet("color: red; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 默认为红色未连接状态，添加左边距
        self.connection_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        connection_layout.addWidget(connection_label)
        connection_layout.addWidget(self.connection_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _create_audio_service_status(self):
        """创建音频服务状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        audio_service_layout = QHBoxLayout(status_widget)
        audio_service_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        audio_service_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        audio_service_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        audio_service_label = QLabel("音频服务:")
        audio_service_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        audio_service_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.audio_service_status = QLabel("未连接")
        self.audio_service_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 添加左边距
        self.audio_service_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        audio_service_layout.addWidget(audio_service_label)
        audio_service_layout.addWidget(self.audio_service_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _create_ai_service_status(self):
        """创建AI服务状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        ai_service_layout = QHBoxLayout(status_widget)
        ai_service_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        ai_service_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        ai_service_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        ai_service_label = QLabel("AI服务:")
        ai_service_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        ai_service_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.ai_service_status = QLabel("未连接")
        self.ai_service_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 添加左边距
        self.ai_service_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        ai_service_layout.addWidget(ai_service_label)
        ai_service_layout.addWidget(self.ai_service_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _create_sync_status(self):
        """创建音画同步状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        sync_layout = QHBoxLayout(status_widget)
        sync_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        sync_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        sync_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        sync_label = QLabel("音画同步:")
        sync_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        sync_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.sync_status = QLabel("未开启")
        self.sync_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 添加左边距
        self.sync_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        sync_layout.addWidget(sync_label)
        sync_layout.addWidget(self.sync_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _create_keyword_status(self):
        """创建关键词状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        keyword_layout = QHBoxLayout(status_widget)
        keyword_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        keyword_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        keyword_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        keyword_label = QLabel("关键词:")
        keyword_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        keyword_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.keyword_status = QLabel("未开启")
        self.keyword_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 添加左边距
        self.keyword_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        keyword_layout.addWidget(keyword_label)
        keyword_layout.addWidget(self.keyword_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _create_user_join_status(self):
        """创建用户加入状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        user_join_layout = QHBoxLayout(status_widget)
        user_join_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        user_join_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        user_join_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        user_join_label = QLabel("动态欢迎:")
        user_join_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        user_join_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.user_join_status = QLabel("未开启")
        self.user_join_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 添加左边距
        self.user_join_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        user_join_layout.addWidget(user_join_label)
        user_join_layout.addWidget(self.user_join_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _create_audio_output_status(self):
        """创建音频输出状态显示"""
        # 创建一个容器
        status_widget = QWidget()
        
        audio_output_layout = QHBoxLayout(status_widget)
        audio_output_layout.setContentsMargins(0, 0, 0, 0)  # 设置边距为0
        audio_output_layout.setSpacing(0)  # 设置名称和状态之间的间距为0，使它们更紧凑
        audio_output_layout.setAlignment(Qt.AlignCenter)  # 居中对齐
        
        audio_output_label = QLabel("音频输出:")
        audio_output_label.setStyleSheet("font-size: 13px;")  # 增加字体大小
        audio_output_label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)  # 右对齐，垂直居中
        
        self.audio_output_status = QLabel("未设置")
        self.audio_output_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")  # 添加左边距
        self.audio_output_status.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)  # 左对齐，垂直居中
        
        audio_output_layout.addWidget(audio_output_label)
        audio_output_layout.addWidget(self.audio_output_status)
        
        # 添加到状态信息行，并设置伸展因子为1，使其均匀分布
        self.status_info_layout.addWidget(status_widget, 1)
    
    def _add_separator(self):
        """添加状态项之间的分隔符"""
        separator = QFrame()
        separator.setFrameShape(QFrame.VLine)
        separator.setFrameShadow(QFrame.Sunken)
        separator.setFixedWidth(1)
        separator.setFixedHeight(18)  # 设置固定高度，使分隔符不会太长
        separator.setStyleSheet("background-color: #DDDDDD; margin-top: 2px; margin-bottom: 2px;")  # 调整颜色和边距
        # 添加到状态信息行，不设置伸展因子，使其不参与均匀分布
        self.status_info_layout.addWidget(separator, 0)
    
    def update_connection_status(self, status):
        """
        更新连接状态
        
        @param status: 状态文本，简化为两种状态：
                     "已连接" - 任何形式的连接（包括视频号和socket）
                     "未连接" - 未建立任何连接
        """
        # 将socket状态转换为已连接
        if status == "socket":
            status = "已连接"
        
        # 处理其他非法状态
        if status not in ["已连接", "未连接"]:
            self.logger.warning(f"收到非法连接状态: {status}，强制转换为'未连接'")
            status = "未连接"
        
        self.connection_status.setText(status)
        if status == "已连接":
            # 已连接状态 - 绿色
            self.connection_status.setStyleSheet("color: green; font-weight: bold; font-size: 13px; margin-left: 2px;")
        else:
            # 未连接状态 - 红色
            self.connection_status.setStyleSheet("color: red; font-weight: bold; font-size: 13px; margin-left: 2px;")
        
        # 更新状态监控模型（如果不是从状态模型调用的）
        if self.status_monitor and self.status_monitor.get_state(StatusType.CONNECTION) != status:
            try:
                self.status_monitor.update_state(StatusType.CONNECTION, status)
            except Exception as e:
                self.logger.error(f"更新连接状态失败: {str(e)}")
    
    def update_audio_service_status(self, status):
        """
        更新音频服务状态 - 仅用于显示音频服务连接状态
        
        @param status: 状态文本，应为"已连接"、"未连接"、"连接中"等
        """
        # 过滤掉非法状态值，如数字或包含"个"的字符串，这些可能是错误传入的主话术数量
        if status is None:
            self.logger.warning("收到None音频服务状态值，忽略此次更新")
            return
        
        # 严格限制音频服务状态的值，只允许与连接相关的状态
        valid_states = ["已连接", "未连接", "连接中", "连接错误", "启动失败"]
        
        if not isinstance(status, str) or status not in valid_states:
            self.logger.warning(f"收到非法的音频服务状态值: {status}，忽略此次更新")
            return
        
        # 设置有效状态值
        self.audio_service_status.setText(status)
        
        # 设置状态样式
        if status == "已连接":
            self.audio_service_status.setStyleSheet("color: green; font-weight: bold; font-size: 13px; margin-left: 2px;")
        elif status == "连接中":
            self.audio_service_status.setStyleSheet("color: orange; font-weight: bold; font-size: 13px; margin-left: 2px;")
        else:
            self.audio_service_status.setStyleSheet("color: red; font-weight: bold; font-size: 13px; margin-left: 2px;")
        
        # 更新状态监控模型（如果不是从状态模型调用的）
        if self.status_monitor and self.status_monitor.get_state(StatusType.AUDIO_SERVICE) != status:
            try:
                self.status_monitor.update_state(StatusType.AUDIO_SERVICE, status)
            except Exception as e:
                self.logger.error(f"更新音频服务状态失败: {str(e)}")
    
    def update_ai_service_status(self, status):
        """
        更新 AI 服务状态
        
        @param status: 状态文本，只支持"已连接"和"未连接"两种状态
        """
        # 确保状态值只能是"已连接"或"未连接"
        if status not in ["已连接", "未连接"]:
            self.logger.warning(f"收到非法AI服务状态: {status}，强制转换为'未连接'")
            status = "未连接"
        
        # 直接更新AI服务状态，不考虑播放状态
        self.ai_service_status.setText(status)
        if status == "已连接":
            self.ai_service_status.setStyleSheet("color: green; font-weight: bold; font-size: 13px; margin-left: 2px;")
        else:
            self.ai_service_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")
        
        # 更新状态监控模型（如果不是从状态模型调用的）
        if self.status_monitor and self.status_monitor.get_state(StatusType.AI_SERVICE) != status:
            try:
                self.status_monitor.update_state(StatusType.AI_SERVICE, status)
            except Exception as e:
                self.logger.error(f"更新AI服务状态失败: {str(e)}")
    
    def update_sync_status(self, status):
        """
        更新音画同步状态
        
        @param status: 状态文本
        """
        # 确保状态文本不为空
        if not status:
            status = "未开启"
        
        # 检查状态文本是否包含数字（可能是错误地传入了项目数量）
        if isinstance(status, int) or (isinstance(status, str) and status.isdigit()) or (isinstance(status, str) and "个" in status):
            # 如果是数字或包含"个"的格式，则替换为默认状态
            status = "未开启"
        
        # 设置状态文本
        self.sync_status.setText(status)
        
        # 根据状态设置不同的样式
        if status == "已开启" or status == "已启用" or status == "关闭":
            self.sync_status.setStyleSheet("color: green; font-weight: bold; font-size: 13px; margin-left: 2px;")
        else:
            self.sync_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")
        
        # 更新状态监控模型（如果不是从状态模型调用的）
        if self.status_monitor and self.status_monitor.get_state(StatusType.SYNC) != status:
            try:
                self.status_monitor.update_state(StatusType.SYNC, status)
            except Exception as e:
                self.logger.error(f"更新音画同步状态失败: {str(e)}")
    
    def update_keyword_status(self, status):
        """
        更新关键词回复状态
        
        @param status: 状态文本，如果以"disabled"开头表示未启用
        """
        if status.startswith("disabled:"):
            # 未启用状态，显示灰色
            actual_status = status.replace("disabled:", "")
            self.keyword_status.setText(actual_status)
            self.keyword_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")
        else:
            # 已启用状态，显示蓝色
            self.keyword_status.setText(status)
            self.keyword_status.setStyleSheet("color: #2196f3; font-weight: bold; font-size: 13px; margin-left: 2px;")
        
        # 更新状态监控模型（如果不是从状态模型调用的）
        if self.status_monitor and self.status_monitor.get_state(StatusType.KEYWORD) != status:
            try:
                self.status_monitor.update_state(StatusType.KEYWORD, status)
            except Exception as e:
                self.logger.error(f"更新关键词回复状态失败: {str(e)}")
    
    def update_user_join_status(self, status):
        """
        更新动态欢迎状态显示
        
        @param status: 状态文本，格式为 "disabled:配置" 或 "配置"
        """
        try:
            # 检查状态文本类型和内容
            self.logger.debug(f"收到动态欢迎状态更新: '{status}', 类型: {type(status)}")
            
            # 检查是否为空状态
            if not status:
                self.logger.warning("收到空的动态欢迎状态，使用默认值'未配置'")
                status = "未配置"
            
            # 检查是否为禁用状态
            is_disabled = isinstance(status, str) and status.startswith("disabled:")
            self.logger.debug(f"状态解析: is_disabled={is_disabled}")
            
            if is_disabled:
                # 提取实际配置
                config = status.split(":", 1)[1]
                self.logger.debug(f"禁用状态，显示配置: '{config}'")
                self.user_join_status.setText(config)
                self.user_join_status.setStyleSheet("color: #757575; font-weight: bold; font-size: 13px; margin-left: 2px;")
                self.logger.debug("已设置灰色样式")
            else:
                # 启用状态显示蓝色
                self.logger.debug(f"启用状态，显示: '{status}'")
                self.user_join_status.setText(status)
                self.user_join_status.setStyleSheet("color: #2196f3; font-weight: bold; font-size: 13px; margin-left: 2px;")
                self.logger.debug("已设置蓝色样式")
            
            self.logger.debug(f"更新动态欢迎状态显示完成: {status} (启用={not is_disabled})")
            
            # 更新状态监控模型（如果不是从状态模型调用的）
            if self.status_monitor and self.status_monitor.get_state(StatusType.USER_JOIN) != status:
                try:
                    self.status_monitor.update_state(StatusType.USER_JOIN, status)
                except Exception as e:
                    self.logger.error(f"更新动态欢迎状态失败: {str(e)}")
        except Exception as e:
            self.logger.error(f"更新动态欢迎状态显示失败: {str(e)}")
            import traceback
            self.logger.error(traceback.format_exc())
    
    def update_audio_output_status(self, device):
        """
        更新音频输出设备状态
        
        @param device: 设备名称，超长时会被截断
        """
        # 限制设备名称长度，避免状态栏过长
        max_length = 12  # 设置最大显示长度
        
        if device and len(device) > max_length:
            display_device = f"{device[:max_length]}..."
            self.logger.debug(f"设备名称过长，已截断: {device} -> {display_device}")
        else:
            display_device = device
        
        self.audio_output_status.setText(display_device)
        self.audio_output_status.setStyleSheet("color: #2196f3; font-weight: bold; font-size: 13px; margin-left: 2px;")
        
        # 更新状态监控模型（如果不是从状态模型调用的）
        if self.status_monitor and self.status_monitor.get_state(StatusType.AUDIO_OUTPUT) != device:
            try:
                self.status_monitor.update_state(StatusType.AUDIO_OUTPUT, device)
            except Exception as e:
                self.logger.error(f"更新音频输出设备状态失败: {str(e)}")

    def set_status_monitor(self, monitor):
        """设置状态监控器"""
        self.status_monitor = monitor
        
        # 连接状态监听器
        if monitor:
            # 连接状态
            self.status_monitor.add_listener(StatusType.CONNECTION, self.update_connection_status)
            
            # 音频服务状态
            self.status_monitor.add_listener(StatusType.AUDIO_SERVICE, self.update_audio_service_status)
            
            # AI服务状态
            self.status_monitor.add_listener(StatusType.AI_SERVICE, self.update_ai_service_status)
            
            # 音画同步状态
            self.status_monitor.add_listener(StatusType.SYNC, self.update_sync_status)
            
            # 关键词回复状态
            self.status_monitor.add_listener(StatusType.KEYWORD, self.update_keyword_status)
            
            # 动态欢迎状态
            self.status_monitor.add_listener(StatusType.USER_JOIN, self.update_user_join_status)
            
            # 音频输出状态
            self.status_monitor.add_listener(StatusType.AUDIO_OUTPUT, self.update_audio_output_status) 